﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Windows.Forms;
using BreukenRekenmachine.Model;
using System.Collections;


namespace BreukenRekenmachine{

    //[System.ComponentModel.DefaultEvent("BreukFoutEventHandler")]
    public partial class BreukenRekenmachine : UserControl
    {
        public delegate void BreukFoutEventHandler(object sender, FoutEventArgs e);
        public event BreukFoutEventHandler Fout;
        
        private ProgrammeerbareBreukContainer breukContainer = new ProgrammeerbareBreukContainer();
        private List<char> bewerkingen = new List<char>();
        private bool getalStatus = true;
        private bool uitkomstStatus = true;
        private bool klaarStatus = false; 

        protected virtual void OnFout(string reden)
        {
            if (Fout != null)
                Fout(this, new FoutEventArgs(reden));
        }


        public BreukenRekenmachine()
        {
            InitializeComponent();
        }

        private void toevoegenKnop_Click(object sender, EventArgs e)
        {
            if (klaarStatus)
            {
                resultaatBox.Text = "";
                bewerkingen.Clear();
                breukContainer.Breuken.Clear();
                klaarStatus = false;
            }
            if (getalStatus)
            {
                if (tellerBox.Text.Length > 0 && noemerBox.Text.Length > 0)
                {
                    if (Convert.ToInt32(noemerBox.Text) != 0)
                    {
                        Breuk temp = new Breuk(Convert.ToInt32(tellerBox.Text), Convert.ToInt32(noemerBox.Text));
                        breukContainer.Add(temp);
                        resultaatBox.Text += temp.ToString();
                        getalStatus = false;
                        uitkomstStatus = true;
                    }
                    else
                    {
                        OnFout("Noemer mag niet 0 zijn");
                    }
                }
                else
                {
                    OnFout("Teller en noemer mogen niet leeg zijn");
                }
            }
            else
            {
                OnFout("U moet eerst een bewerking kiezen");
            }
        }

        private void tellerNoemerBox_Validating(object sender, System.ComponentModel.CancelEventArgs e)
        {
            if (((TextBox)sender).Text.Length > 0)
            {
                try
                {
                    int numberEntered = int.Parse(((TextBox)sender).Text);
                }
                catch (FormatException)
                {
                    e.Cancel = true;
                    OnFout("U moet een numerieke waarde opgeven in het Teller- en/of Noemerveld.");
                }
            }
        }

        private void bewerking_Click(object sender, EventArgs e)
        {
            if (!getalStatus)
            {
                resultaatBox.Text += " " + ((Button)sender).Text + " ";
                bewerkingen.Add(((Button)sender).Text[0]);
                getalStatus = true;
                uitkomstStatus = false;
            }
            else
            {
                OnFout("U moet eerst een getal kiezen");
            }

        }

        private void uitkomstButton_Click(object sender, EventArgs e)
        {
            if (uitkomstStatus)
            {
                if (breukContainer.Breuken.Count > 1)
                {
                    Breuk temp = breukContainer[0];
                    for (int i = 1; i < breukContainer.Breuken.Count; i++)
                    {
                        switch (bewerkingen[i - 1])
                        {
                            case '+': temp += breukContainer[i];
                                break;
                            case '-': temp -= breukContainer[i];
                                break;
                            case '*': temp *= breukContainer[i];
                                break;
                            case '/': temp /= breukContainer[i];
                                break;
                        }
                    }
                    resultaatBox.Text += " = " + temp.ToString();
                    temp.Vereenvoudig();
                    resultaatBox.Text += " = " + temp.ToString();
                    getalStatus = true;
                    uitkomstStatus = false;
                    klaarStatus = true;
                }
                else
                {
                    OnFout("U moet minstens 2 breuken hebben om een bewerking te kunnen doen");
                }
            }
            else
            {
                OnFout("U moet eerst een getal kiezen");
            }
        }

    }
}
